#ifndef BUKEKEDISHIDRIVE_H
#define BUKEKEDISHIDRIVE_H

#include "forkliftdrive.h"

#include <QObject>

/**
 * @brief The bukekedishidrive class 步科旋转电机+柯蒂斯直行控制器（）+IO升降控制
 */
class BukeKedishiDrive : public ForkliftDrive {
public:
    explicit BukeKedishiDrive( QObject* parent = nullptr );
    bool CanRecviveData() override;                                        //处理can接收的数据
    void RegularGetData() override;                                        //定期获取can数据
    void CanSetSpeedAngle( double walk_speed, double veer_rad ) override;  //外部设定行走速度值, 转角弧度值
    //    void CanDataFrameSetKDSData( CanDataFrame& frame, short& speed, uchar& kdsRise, uchar& kdsFall );  //发送柯蒂斯行走
    //    void CanDataFrameSetForkRaiseSpeed( CanDataFrame& frame, uchar value );                            //上升电磁阀速度 id222 0~255
    //    void CanDataFrameSetKDSData( CanDataFrame& frame, short& speed, uchar& kds_speed_state );          //发送柯蒂斯行走
    void push_fork_upper() override;
    void push_fork_stop() override;
    void push_fork_down() override;
    void switchAutoModel() override;
    void switchHandleModel() override;
public slots:
    void sltForkLiftDrive_Init() override;
    //    void CanDataFrameControlByte8Byte( CanDataFrame& frame, uint32 uid, BYTE b[] );

private:
    bool is_auto_model = false;  //叉车自动控制模式
    void autoModelInit();        //自动模式初始化
    void handleModelInit();      //手动模式初始化

    /****************************柯蒂斯控制器******************************************/
    /**
     * @brief kds_speed_state 前进：1011 0000 0xB0 ，后退：0111 0000 0x70
      Bit0	前进：1有效，0无效
      Bit1	后退：1有效，0无效
      Bit2	自动模式Interlock:1有效，0无效
      Bit3	BRAKE刹车：1有效，0无效
      Bit4
      Bit5
      Bit6
      Bit7
     */
    BYTE kds_speed_state = 0x00;
    //直行报文
    BYTE kds_speed_byte[ 8 ] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    //货叉升降控制字
    /**
     * @brief kds_fork_up_down_state 升降
     *  Bit0	前进：1有效，0无效
     *  Bit1	后退：1有效，0无效
     *  Bit2	自动模式Interlock:1有效，0无效
     *  Bit3	BRAKE刹车：1有效，0无效
     *  Bit4
     *  Bit5
     *  Bit6
     *  Bit7
     */
    BYTE kds_fork_up_down_state = 0x00;
    BYTE kds_updown_speed[ 2 ]  = { 0x00, 0x00 };
    //升降报文
    BYTE kds_fork_up_donw_byte[ 8 ] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    /****************************柯蒂斯控制器******************************************/
    /****************************步科伺服驱动器******************************************/
    //位置模式
    BYTE step_model_set[ 8 ]     = { 0x2F, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00 };  //步科 模式
    BYTE step_speed_set[ 8 ]     = { 0x23, 0x81, 0x60, 0x00, 0x55, 0x55, 0x08, 0x00 };  //步科 速度
    BYTE step_position_set[ 8 ]  = { 0x23, 0x7A, 0x60, 0x00, 0x55, 0x55, 0x08, 0x00 };  //步科 目标位置:[4],[5],[6],[7] 2730/rpm
    BYTE step_speed_set_acc[ 8 ] = { 0x23, 0x83, 0x60, 0x00, 0x55, 0x55, 0x08, 0x00 };  //步科 加速度使用默认
    BYTE step_speed_set_dec[ 8 ] = { 0x23, 0x84, 0x60, 0x00, 0x55, 0x55, 0x08, 0x00 };  //步科 减速度使用默认
    BYTE step_control_set[ 8 ]   = { 0x2B, 0x40, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00 };  //控制字

    /****************************步科伺服驱动器******************************************/

    /****************************科蒂斯手动模式伺服驱动器 DIN******************************************/
    BYTE step_DIN1_set[ 8 ] = { 0x2B, 0x10, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00 };  //步科DIN1 0
    BYTE step_DIN2_set[ 8 ] = { 0x2B, 0x10, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00 };  //步科DIN2 0
    BYTE step_DIN5_set[ 8 ] = { 0x2B, 0x10, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00 };  //步科DIN5 0
    BYTE step_DIN6_set[ 8 ] = { 0x2B, 0x10, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00 };  //步科DIN6 0

    /****************************科蒂斯手动模式伺服驱动器 DIN******************************************/
};

#endif  // BUKEKEDISHIDRIVE_H
